home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / edu / mathcal / mathcal.c < prev    next >
Text File  |  1995-08-12  |  8KB  |  373 lines

  1. /* 1992.10.3 守屋一成(morip)作 */
  2. /* 1993.6.27 一部変更 */
  3. /* 1994.2.13 複素数に拡張、ユーザ定数が使用可能 */
  4. /* 1995.2.12 行列化、対話モード導入 */
  5. /* 1995.8.12 ヒストリ機能追加、ソース分割、名称変更 */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <sys/extender.h>
  11. #include "expanl.h"
  12.  
  13. #define RIGHT 0x1c
  14. #define LEFT 0x1d
  15. #define UP 0x1e
  16. #define DOWN 0x1f
  17. #define BS 0x8
  18. #define CR 0xd
  19.  
  20. #define LANG 'j'
  21.  
  22. struct his{
  23.   char *exp;
  24.   struct his *pre;
  25.   struct his *next;
  26. };
  27.  
  28. typedef struct his histry;
  29.  
  30. char *keyinput(void);
  31. char *strinsert(char *, char, int);
  32. char *strdelete(char *, int);
  33.  
  34. char *strdelete(char *expression, int loc)
  35. {
  36.   int n;
  37.   
  38.   for (n = loc; n <= strlen(expression); n++) {
  39.     expression[n - 1] = expression[n];
  40.   }
  41.   
  42.   return expression;
  43. }
  44.  
  45. char *strinsert(char *expression, char c, int loc)
  46. {
  47.   int n;
  48.   
  49.   for (n = strlen(expression) + 1; n > loc; n--) {
  50.     expression[n] = expression[n - 1];
  51.   }
  52.   expression[n] = c;
  53.   
  54.   return expression;
  55. }
  56.  
  57. char *keyinput(void)
  58. {
  59.   int i, l, j, k, f, len;
  60.   char c, tmp[256], expression[256];
  61.   histry *sw, *tmph, *pre, *next;
  62.   static histry *last = NULL;
  63.   
  64.   pre = last;
  65.   next = NULL;
  66.   sw = last;
  67.   f = 0;
  68.   i = 0;
  69.   l = 0;
  70.   expression[0] = '\0';
  71.   tmp[0] = '\0';
  72.   while ((c = _dos_keyboard_input_without_echo()) != CR) {
  73.     if (c < 0x20) {
  74.       switch(c) {
  75.         case UP:
  76.           tmph = pre;
  77.           len = strlen(tmp);
  78.           if (len != 0) {
  79.             k = 2;
  80.             while (tmph != NULL) {
  81.               k = 1;
  82.               for (j = 0; j < len; j++) {
  83.                 if (tmp[j] != *((tmph->exp) + j)) {
  84.                   k = 0;
  85.                   sw = tmph->pre;
  86.                   break;
  87.                 }
  88.               }
  89.               if (k == 1) {
  90.                 f = 1;
  91.                 sw = NULL;
  92.                 break;
  93.               }
  94.               tmph = tmph->pre;
  95.             }
  96.             if (tmph == NULL && k == 0) {
  97.               if (f == 0) {
  98.                 sw = pre;
  99.               }
  100.               tmph = sw;
  101.             }
  102.           }
  103.           else {
  104.             sw = tmph->pre;
  105.           }
  106.           if (tmph != NULL) {
  107.             strcpy(expression, tmph->exp);
  108.             pre = tmph->pre;
  109.             next = tmph->next;
  110.             
  111.             for (j = 0; j < l; j++) {
  112.               putchar('\b');
  113.             }
  114.             for (j = 0; j < i; j++) {
  115.               putchar(' ');
  116.             }
  117.             for (j = 0; j < i; j++) {
  118.               putchar('\b');
  119.             }
  120.             i = strlen(expression);
  121.             l = i;
  122.             printf("%s", expression);
  123.           }
  124.           break;
  125.         case DOWN:
  126.           tmph = next;
  127.           len = strlen(tmp);
  128.           if (len != 0) {
  129.             k = 2;
  130.             while (tmph != NULL) {
  131.               k = 1;
  132.               for (j = 0; j < len; j++) {
  133.                 if (tmp[j] != *((tmph->exp) + j)) {
  134.                   k = 0;
  135.                   sw = tmph->next;
  136.                   break;
  137.                 }
  138.               }
  139.               if (k == 1) {
  140.                 sw = NULL;
  141.                 break;
  142.               }
  143.               tmph = tmph->next;
  144.             }
  145.             if (tmph == NULL && k == 0) {
  146.               if (f == 0) {
  147.                 sw = next;
  148.               }
  149.               tmph = sw;
  150.             }
  151.           }
  152.           else {
  153.             sw = tmph->next;
  154.           }
  155.           if (tmph != NULL) {
  156.             strcpy(expression, tmph->exp);
  157.             pre = tmph->pre;
  158.             next = tmph->next;
  159.             
  160.             for (j = 0; j < l; j++) {
  161.               putchar(LEFT);
  162.             }
  163.             for (j = 0; j < i; j++) {
  164.               putchar(' ');
  165.             }
  166.             for (j = 0; j < i; j++) {
  167.               putchar(LEFT);
  168.             }
  169.             i = strlen(expression);
  170.             l = i;
  171.             printf("%s", expression);
  172.           }
  173.           else if (tmph == NULL && pre != last) {
  174.             strcpy(expression, tmp);
  175.             pre = last;
  176.             next = NULL;
  177.             
  178.             for (j = 0; j < l; j++) {
  179.               putchar(LEFT);
  180.             }
  181.             for (j = 0; j < i; j++) {
  182.               putchar(' ');
  183.             }
  184.             for (j = 0; j < i; j++) {
  185.               putchar(LEFT);
  186.             }
  187.             i = strlen(expression);
  188.             l = i;
  189.             printf("%s", expression);
  190.           }
  191.             
  192.           break;
  193.         case RIGHT:
  194.           l++;
  195.           if (l > i) {
  196.             l = i;
  197.           }
  198.           else {
  199.             putchar(RIGHT);
  200.           }
  201.           break;
  202.         case LEFT:
  203.           l--;
  204.           if (l < 0) {
  205.             l = 0;
  206.           }
  207.           else {
  208.             putchar(LEFT);
  209.           }
  210.           break;
  211.         case BS:
  212.           if (l != 0) {
  213.             strdelete(expression, l);
  214.             i--;
  215.             l--;
  216.             putchar(LEFT);
  217.             printf("%s ", expression + l);
  218.             for (j = -1; j < strlen(expression + l); j++) {
  219.               putchar(LEFT);
  220.             }
  221.             strcpy(tmp, expression);
  222.             pre = last;
  223.             sw = pre;
  224.             f = 0;
  225.           }
  226.           break;
  227.       }
  228.     }
  229.     else {
  230.       strinsert(expression, c, l);
  231.       printf("%s", expression + l);
  232.       len = strlen(expression + l);
  233.       for (j = 1; j < len; j++) {
  234.         putchar(LEFT);
  235.       }
  236.       strcpy(tmp, expression);
  237.       pre = last;
  238.       sw = pre;
  239.       f = 0;
  240.       i++;
  241.       l++;
  242.     }
  243.   }
  244.   if (strlen(expression) != 0) {
  245.     pre = last;
  246.     j = 0;
  247.     if (pre != NULL) {
  248.       while (strcmp(expression, pre->exp) != 0) {
  249.         if ((pre = pre->pre) == NULL) {
  250.           j = 1;
  251.           break;
  252.         }
  253.       }
  254.     }
  255.     else {
  256.       j = 1;
  257.     }
  258.     
  259.     if (j == 1) {
  260.       tmph = last;
  261.       if (tmph != NULL) {
  262.         while (tmph->pre != NULL) {
  263.           tmph = tmph->pre;
  264.         }
  265.       }
  266.       
  267.       while ((pre = (histry *)malloc(sizeof(histry))) == NULL) {
  268.         if (tmph != NULL) {
  269.           free(tmph->exp);
  270.           next = tmph->next;
  271.           free(tmph);
  272.           if (next != NULL) {
  273.             next->pre = NULL;
  274.             tmph = next;
  275.           }
  276.           else {
  277.             last = NULL;
  278.             tmph = NULL;
  279.           }
  280.         }
  281.         else {
  282.           puts("No more memories.\n");
  283.           exit(1);
  284.         }
  285.       }
  286.       while ((pre->exp = (char *)malloc((strlen(expression) + 1) * sizeof(char))) == NULL) {
  287.         if (tmph != NULL && tmph != pre) {
  288.           free(tmph->exp);
  289.           next = tmph->next;
  290.           free(tmph);
  291.           if (next != NULL) {
  292.             next->pre = NULL;
  293.             tmph = next;
  294.           }
  295.           else {
  296.             last = NULL;
  297.             tmph = NULL;
  298.           }
  299.         }
  300.         else {
  301.           puts("No more memories.\n");
  302.           exit(1);
  303.         }
  304.       }
  305.       strcpy(pre->exp, expression);
  306.     }
  307.     else {
  308.       if (pre->pre != NULL) {
  309.         (pre->pre)->next = pre->next;
  310.       }
  311.       if (pre->next != NULL) {
  312.         (pre->next)->pre = pre->pre;
  313.       }
  314.       else {
  315.         last = last->pre;
  316.       }
  317.     }
  318.     pre->pre = last;
  319.     pre->next = NULL;
  320.     if (last != NULL) {
  321.       last->next = pre;
  322.     }
  323.     last = pre;
  324.   }
  325.   
  326.   return expression;
  327. }
  328.  
  329. void main(int argc, char *argv[])
  330. {
  331.   int i;
  332.   char expression[256];
  333.   matrix ansr;
  334.   
  335.   for(i = 0; i <= UCN - 1; i++) {
  336.     cnst[i].name[0] = '\0';
  337.   }
  338.   
  339.   if (argc == 1) {
  340.     printf("\n>> ");
  341.     strcpy(expression, keyinput());
  342.     while (strcmp(expression, "quit") != 0) {
  343.       ansr = expanl(expression);
  344.       
  345.       if (strlen(expression) != 0) {
  346.         if (mathcalerr != 0) {
  347.           printf("\n%s\n", emessage(LANG));
  348.         }
  349.         else {
  350.           printf("\n%s=\n", expression);
  351.           mprintf(ansr);
  352.         }
  353.       }
  354.       printf("\n>> ");
  355.       
  356.       strcpy(expression, keyinput());
  357.     }
  358.   }
  359.   else {
  360.     for (i = 1; i <= argc - 1; i++) {
  361.       ansr = expanl(argv[i]);
  362.       
  363.       if (mathcalerr != 0) {
  364.         printf("\n%s\n", emessage(LANG));
  365.       }
  366.       else {
  367.         printf("\n%s=\n", argv[i]);
  368.         mprintf(ansr);
  369.       }
  370.     }
  371.   }
  372. }
  373.